Skip to content

Emit retags in codegen to support BorrowSanitizer (part 4)#158100

Open
icmccorm wants to merge 4 commits into
rust-lang:mainfrom
BorrowSanitizer:codegen-emit-retag-4
Open

Emit retags in codegen to support BorrowSanitizer (part 4)#158100
icmccorm wants to merge 4 commits into
rust-lang:mainfrom
BorrowSanitizer:codegen-emit-retag-4

Conversation

@icmccorm

@icmccorm icmccorm commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Tracking issue: #154760
Zulip Thread

This is one of several PRs that add experimental support for emitting retags as function calls in codegen.

This PR emits our retag intrinsics based on the structure of a RetagPlan. The feature works end-to-end now! But, it has two limitations:

  • We do not track interior mutable or pinned ranges precisely. This will come in the next PR, which should be the last one that we need to complete this feature (excluding documentation and compile tests).

  • We recurse into repr(simd) types when building a RetagPlan, but we do not emit retags for their fields. We would need BuilderMethods::insert_element, which isn't available. I'm not sure what the best workaround would be for this.

Related: #157825, #156210, #156208

Cc: @RalfJung
r? @saethlin

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jun 18, 2026
@rust-log-analyzer

This comment has been minimized.

Comment thread compiler/rustc_codegen_ssa/src/mir/retag.rs Outdated
Comment on lines +354 to +356
// If the variant contains another variant, then the current block
// will be different than the one that we created above. We want this
// block to jump to the terminator block.

@saethlin saethlin Jun 27, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is quite right. For example:

#![crate_type = "lib"]

pub enum Inner {
    A(&'static u8),
    B(&'static u16),
}

pub enum Outer {
    P(&'static u32),
    Q(Inner),
}

#[inline(never)]
pub fn demo(_x: Outer) {}

produces a block for the Outer::Q case that recurses into the Inner, but that block has no predecessors.

View changes since the review

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! This should be fixed now with 19ba1b0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants